package com.quanyan.pay.service;

import com.quanyan.api.APIResponse;
import com.quanyan.common.Plugin.PageObj;
import com.quanyan.orderpay.request.ReqOrderCancel;
import com.quanyan.orderpay.request.ReqOrderRefund;
import com.quanyan.orderpay.request.ReqRefundPayInfo;
import com.quanyan.orderpay.request.ReqSysPayInfo;
import com.quanyan.orderpay.response.RespOrderInfo;
import com.quanyan.orderpay.response.mq.RespRefundPayInfo;
import com.quanyan.pay.entity.*;
import com.quanyan.pay.web.request.ReqPreOrder;
import com.quanyan.pay.web.request.ReqRefundRecord;
import com.quanyan.pay.web.response.RespRefundEntity;
import com.quanyan.weichat.common.Configure;

import javax.validation.Valid;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 与支付相关的Service
 *
 * @author songzj
 * @date 16/5/27-09:44
 */
public interface PayService {

    /**
     * 订单状态
     */
    String PAY_CLOSE_EXCEPTION="异常订单:关闭后又被支付了";


    /**
     * 订单状态
     */
    Byte PAY_RECORD_STATUS_INIT = 0; //初始态
    Byte PAY_RECORD_STATUS_SEND_PAY_REQ = 1; //发起支付请求
    Byte PAY_RECORD_STATUS_RECV_PAY_RESP = 2; //收到第三方平台回调.
    Byte PAY_RECORD_STATUS_SEND_REFUND_REQ = 3; //发起退款请求
    Byte PAY_RECORD_STATUS_RECV_REFUND_RESP = 4; //收到第三方退款回调.
    Byte PAY_RECORD_STATUS_CANCEL = 5; //取消支付

    /**
     * 支付状态
     */
    Byte PAY_RECORD_PAY_STATE_UNPAIED = 0; //未支付
    Byte PAY_RECORD_PAY_STATE_PAIED = 1; //已支付

    /**
     * 退款状态
     */
    Byte PAY_RECORD_REFUND_STATE_UNREFUND = 0; //未退款
    Byte PAY_RECORD_REFUND_STATE_REFUND_PART = 1; //部分退款
    Byte PAY_RECORD_REFUND_STATE_REFUND_ALL = 2; //全部退款

    Byte REFUND_STATE_UN_REFUND = 0; //未退款
    Byte REFUND_STATE_REFUND = 1;  //已退款



    /**
     * 生成预支付数据
     * 对于同一orderNo的数据只接收一次. 避免重复支付.
     * 返回:已签名支付数据
     *
     * @return
     * @Valid 对参数有效性进行校验
     */
    @Valid
    APIResponse insertUserPrePay(ReqPreOrder preOrder);

    /**
     * 支付成功处理
     *
     * @param tsn
     * @param orderNo
     * @param payTime
     * @param amount        @return
     * @param buyer_id
     * @param buyer_account
     */
    APIResponse updatePaySuccessProcess(String tsn, String orderNo, Date payTime, int amount, String buyer_id, String buyer_account, String buyer_bank, String sellerId, String sellerAccount);

    /**
     * 查询已开启的支付方式
     *
     * @param reqPayInfo
     * @param
     * @return
     */
    APIResponse<List<PayInfo>> selectEnablePayInfos(ReqSysPayInfo reqPayInfo);


    /**
     * 申请开通支付方式
     *
     * @param reqPayInfo
     * @return
     */
    APIResponse<List<PayInfo>> applyEnablePayInfos(ReqSysPayInfo reqPayInfo);


    /**
     * 退款记账, 并发起退款请求到第三方，如果是鸟蛋支付，则立即退还鸟蛋
     * 这里返回成功并不是真实的提现成功, 而是申请第三方成功.
     *
     * @param reqRefundRecord
     * @param reqOrderRefund
     * @return
     */
    APIResponse<RespRefundEntity> insertRefundRecord(ReqRefundRecord reqRefundRecord, ReqOrderRefund reqOrderRefund);

    /**
     * 退款记账, 并发起退款请求到第三方，如果是鸟蛋支付，则立即退还鸟蛋
     * 这里返回成功并不是真实的提现成功, 而是申请第三方成功.
     *
     * @param reqRefundRecord
     * @param reqOrderRefund
     * @param larkAppId
     * @return
     */
    APIResponse<RespRefundEntity> insertRefundRecord(ReqRefundRecord reqRefundRecord, ReqOrderRefund reqOrderRefund, int larkAppId);

    /**
     * 根据城市ID. 支付ID.
     *
     * @param mchId
     * @param payId
     * @return
     */
    APIResponse<WeichatAccount> getWeichatAccount(String mchId, Integer payId);

    /**
     * 根据城市ID. 支付ID.
     *
     * @param mchId
     * @param payId
     * @return
     */
    APIResponse<WeichatAccount> getWeichatAccount(String mchId, Integer payId, Integer larkAppId);

    /**
     * 根据城市ID, 支付ID
     *
     * @param mchId
     * @param payId
     * @return
     */
    APIResponse<AlipayAccount> getAlipayAccount(String mchId, Integer payId);


    /**
     * @param appId 微信appId
     * @param mchId 微信商户号
     * @return
     */
    APIResponse<Configure> getWeichatAccount(String appId, String mchId);

    /**
     * @param appId 微信appId
     * @param mchId 微信商户号
     * @return
     */
    APIResponse<Configure> getWeichatAccount(String appId, String mchId,boolean flag);
    /**
     * 校验订单是否已经支付
     *
     * @param data
     * @return true:已支付  false:未支付
     */
    boolean checkUserPayed(ReqOrderCancel data);

    /**
     * 取消支付
     *
     * @param data
     * @return
     */
    boolean cancelOrder(ReqOrderCancel data);


    /**
     * 支付状态查询
     *
     * @return
     */
    APIResponse queryPayStatus();

    /**
     * @param pageNo
     * @return
     */
    APIResponse<PageObj<List<RefundRecord>>> refundWechatStatusQuery(int pageNo);

    /**
     * 根据订单号获取支付详情列表
     *
     * @param orderNo
     * @return
     */
    List<PayRecordDetail> selectPayRecordDetailByOrderNo(String orderNo);

    /**
     * 根据退款单号获取用户退款信息
     *
     * @param refundOrderNo
     * @return
     */
    List<RespRefundPayInfo> selectRefundPayInfoList(String refundOrderNo);

    /**
     * 获取支付记录
     *
     * @param orderNo
     * @return
     */
    PayRecord selectPayRecordByOrderNo(String orderNo);


    /**
     * 退款结束处理
     * @return
     */
    APIResponse refundCompleteProcess(RefundCompleteData refundCompleteData);


    //通过退款批次号获取退款号
    RefundRecord selectByBatchNo(String batchNo);

    RefundRecord selectByRefundOrderNo(String refundOrderNo);

    AlipayAccount selectAliPayAccountByAppId(String appId);

    List<ReqRefundPayInfo> selectThreePayDetailByOrderNo(String orderNo);

    List<RefundRecord> selectRefundRecordByOrderNo(String orderNo);

    TSNRecord selectTsnRecord(String orderNo);

    APIResponse<List<RespOrderInfo>> orderQueryBacth(List<String> orderList);

    Map<String, String> getWeichatOrderStatusByOrderNo(String orderNo);
}
